using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public CidadeVO getCidade(int? idCidade, string cidade)
		{
			CidadeVO cidadeVO = null;
			List<CidadeVO> listCidadeVOs = getCidades(idCidade, cidade, null);
			if (listCidadeVOs != null && listCidadeVOs.Count > 0)
			{
				cidadeVO = listCidadeVOs[0];
			}
			return cidadeVO;
		}

		public CidadeVO getCidade(int? idCidade)
		{
			return getCidade(idCidade, null);
		}

		public List<CidadeVO> getCidades()
		{
			return getCidades(null, null, null);
		}

		public List<CidadeVO> getCidades(int? idCidade)
		{
			return getCidades(idCidade, null, null);
		}

		public List<CidadeVO> getCidades(int? idCidade, string cidade)
		{
			return getCidades(idCidade, cidade, null);
		}

		public List<CidadeVO> getCidades(int? idCidade, string cidade, int? idUf)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT cid.idCidade as cid_idCidade, cid.idUf as cid_idUf, uf.sigla as uf_sigla, cid.cidade as cid_cidade, cid.Cadastro as cid_Cadastro, cid.CadastradoPor as cid_CadastradoPor, cid.Edicao as cid_Edicao, cid.EditadoPor as cid_EditadoPor  ");
			query.AppendLine("FROM cidade as cid LEFT OUTER JOIN uf as uf on cid.idUf=uf.idUf  ");
			if (idCidade != null)
			{
				query.AppendLine(where + "cid.idCidade=@idCidade ");
				where = "AND ";
			}
			if (idUf != null)
			{
				query.AppendLine(where + "cid.idUf=@idUf ");
				where = "AND ";
			}
			if (cidade != null)
			{
				query.AppendLine(where + "cid.cidade LIKE @cidade ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY cid.cidade ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idCidade!= null) cmd.Parameters.Add(getParameter(cmd, "@idCidade", idCidade));
			if (idUf!= null) cmd.Parameters.Add(getParameter(cmd, "@idUf", idUf));
			if (cidade!= null) cmd.Parameters.Add(getParameter(cmd, "@cidade", "%"+cidade+"%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<CidadeVO> listCidade = new List<CidadeVO>();

				while (reader.Read())
				{
					CidadeVO cidadeVO = CidadeVO.CreateVO();
					cidadeVO.idCidade = reader.GetInt32(reader.GetOrdinal("cid_idCidade"));
					cidadeVO.idUf = reader.GetInt32(reader.GetOrdinal("cid_idUf"));
					if (!reader.IsDBNull(reader.GetOrdinal("uf_sigla")))
						cidadeVO.idUfVO.sigla = reader.GetString(reader.GetOrdinal("uf_sigla"));
					cidadeVO.cidade = reader.GetString(reader.GetOrdinal("cid_cidade"));
					cidadeVO.cadastro = reader.GetDateTime(reader.GetOrdinal("cid_Cadastro"));
					cidadeVO.cadastradoPor = reader.GetString(reader.GetOrdinal("cid_CadastradoPor"));
					cidadeVO.edicao = reader.GetDateTime(reader.GetOrdinal("cid_Edicao"));
					cidadeVO.editadoPor = reader.GetString(reader.GetOrdinal("cid_EditadoPor"));


					listCidade.Add(cidadeVO);
				}
				reader.Close();
				return listCidade;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setCidade(CidadeVO cidadeVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE cidade ");
			query.AppendLine("SET idUf=@idUf, cidade=@cidade,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idCidade=@idCidade ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCidade", cidadeVO.idCidade));
			cmd.Parameters.Add(getParameter(cmd, "@idUf", cidadeVO.idUf));
			cmd.Parameters.Add(getParameter(cmd, "@cidade", cidadeVO.cidade));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", cidadeVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", cidadeVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", cidadeVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", cidadeVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newCidade(CidadeVO cidadeVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO cidade ");
			query.AppendLine("  ( idUf, cidade, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @idUf, @cidade, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idUf", cidadeVO.idUf));
			cmd.Parameters.Add(getParameter(cmd, "@cidade", cidadeVO.cidade));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", cidadeVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", cidadeVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", cidadeVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", cidadeVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('cidade') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delCidade(CidadeVO cidadeVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM cidade ");
			query.AppendLine("WHERE idCidade=@idCidade ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCidade", cidadeVO.idCidade));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountCidadexIdUf(int? idUf)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idUf) as ocorrencias FROM cidade WHERE IdUf=@IdUf ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdUf", idUf));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
